#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
日志服务模块
处理事件日志的导入和预处理
"""

import os
import pandas as pd
import pm4py
from datetime import datetime
from pm4py.objects.log.util import dataframe_utils
from pm4py.objects.conversion.log import converter as log_converter

class LogService:
    """日志服务类，处理事件日志的导入和预处理"""
    
    def __init__(self):
        """初始化日志服务"""
        self.log_df = None
        self.event_log = None
    
    def import_log(self, file_path):
        """导入日志文件
        
        Args:
            file_path: 日志文件路径
            
        Returns:
            dict: 日志信息字典
        """
        try:
            print(f"开始导入日志: {file_path}")  # 调试信息
            
            # 根据文件扩展名选择导入方法
            ext = os.path.splitext(file_path)[1].lower()
            
            if ext == '.csv':
                # 读取CSV文件
                self.log_df = pd.read_csv(file_path)
                
                # 确保必要的列存在
                required_columns = ['case:concept:name', 'concept:name', 'time:timestamp']
                if not all(col in self.log_df.columns for col in required_columns):
                    # 如果列名不匹配，尝试重命名
                    if 'case_id' in self.log_df.columns:
                        self.log_df = self.log_df.rename(columns={
                            'case_id': 'case:concept:name',
                            'activity': 'concept:name',
                            'timestamp': 'time:timestamp'
                        })
                    else:
                        raise ValueError(f"CSV文件缺少必要的列: {required_columns}")
                
                # 清理时间戳数据
                self.log_df['time:timestamp'] = self.log_df['time:timestamp'].str.strip()
                
                # 使用更严格的时间戳解析
                try:
                    self.log_df['time:timestamp'] = pd.to_datetime(
                        self.log_df['time:timestamp'],
                        format='%Y-%m-%d %H:%M:%S',
                        exact=True
                    )
                except ValueError as e:
                    print(f"时间戳解析错误，尝试其他格式: {str(e)}")  # 调试信息
                    # 尝试自动推断格式
                    self.log_df['time:timestamp'] = pd.to_datetime(
                        self.log_df['time:timestamp'],
                        infer_datetime_format=True
                    )
                
                # 按时间戳排序
                self.log_df = self.log_df.sort_values('time:timestamp')
                
                # 转换为PM4Py要求的格式
                self.log_df = pm4py.format_dataframe(
                    self.log_df,
                    case_id='case:concept:name',
                    activity_key='concept:name',
                    timestamp_key='time:timestamp'
                )
                
            elif ext == '.xes':
                # 直接使用PM4Py导入XES文件
                self.event_log = pm4py.read_xes(file_path)
                # 转换为DataFrame
                self.log_df = pm4py.convert_to_dataframe(self.event_log)
            else:
                raise ValueError(f"不支持的文件格式: {ext}")
            
            print(f"日志数据预览:\n{self.log_df.head()}")  # 调试信息
            print(f"列名: {self.log_df.columns.tolist()}")  # 调试信息
            
            # 转换为事件日志对象
            self.event_log = pm4py.convert_to_event_log(self.log_df)
            
            # 统计信息
            case_count = len(self.log_df['case:concept:name'].unique())
            event_count = len(self.log_df)
            activity_count = len(self.log_df['concept:name'].unique())
            start_time = self.log_df['time:timestamp'].min()
            end_time = self.log_df['time:timestamp'].max()
            
            log_info = {
                'case_count': case_count,
                'event_count': event_count,
                'activity_count': activity_count,
                'start_time': start_time,
                'end_time': end_time
            }
            
            print(f"日志信息: {log_info}")  # 调试信息
            return log_info
            
        except Exception as e:
            print(f"导入错误: {str(e)}")  # 调试信息
            raise Exception(f"导入日志失败: {str(e)}")
    
    def get_log(self):
        """获取当前的事件日志
        
        Returns:
            DataFrame: 事件日志DataFrame
        """
        if self.log_df is None:
            raise ValueError("还未导入日志")
        return self.log_df
    
    def get_event_log(self):
        """获取PM4Py格式的事件日志
        
        Returns:
            EventLog: PM4Py事件日志对象
        """
        if self.event_log is None:
            raise ValueError("还未导入日志")
        return self.event_log 